/**
 * 视频通话窗口管理服务
 * 用于创建和管理独立的视频通话窗口
 */

import { isTauri } from './secure-storage'

export interface VideoCallWindowOptions {
  targetUserId: string
  targetName: string
  currentUserId: string
  getUserInitial: (userId: string) => string
  isVoiceOnly?: boolean
  onClose?: () => void
}

let videoCallWindow: any = null
let windowId: string = 'video-call-window' // 使用固定 ID，确保只有一个窗口

/**
 * 创建或更新视频通话窗口
 * 注意：此函数已被禁用，现在统一使用对话框模式，不再创建独立窗口
 */
export async function createVideoCallWindow(options: VideoCallWindowOptions): Promise<void> {
  // 已禁用独立窗口功能，统一使用对话框模式
  console.warn('独立窗口功能已禁用，使用对话框模式')
  return
  
  if (!isTauri()) {
    console.warn('非 Tauri 环境，无法创建独立窗口')
    return
  }

  try {
    // 在 Tauri v2 中，WebviewWindow 从 @tauri-apps/api/webviewWindow 导入
    const { getCurrentWindow } = await import('@tauri-apps/api/window')
    const { WebviewWindow } = await import('@tauri-apps/api/webviewWindow')
    
    // 检查 WebviewWindow 是否可用
    if (!WebviewWindow || typeof WebviewWindow !== 'function') {
      console.error('WebviewWindow 不可用')
      throw new Error('WebviewWindow 构造函数不可用，请检查 Tauri API 版本和配置')
    }
    
    // 检查窗口是否已存在
    try {
      const existingWindow = await WebviewWindow.getByLabel(windowId)
      if (existingWindow) {
        // 如果窗口已存在，更新 URL 和标题而不是创建新窗口
        const isDev = import.meta.env.DEV
        const baseUrl = isDev ? 'http://localhost:1420' : ''
        // 开发环境使用源文件路径，生产环境使用构建后的路径
        const videoCallPath = isDev ? '/src/pages/video-call/index.html' : '/video-call.html'
        const videoCallUrl = `${baseUrl}${videoCallPath}?targetUserId=${encodeURIComponent(options.targetUserId)}&targetName=${encodeURIComponent(options.targetName)}&currentUserId=${encodeURIComponent(options.currentUserId)}&isVoiceOnly=${options.isVoiceOnly || false}`
        
        // 在 Tauri v2 中，尝试使用 navigate 方法（如果存在）
        // 如果不存在，则关闭旧窗口并创建新窗口
        try {
          if (typeof (existingWindow as any).navigate === 'function') {
            await (existingWindow as any).navigate(videoCallUrl)
          } else {
            // 如果 navigate 不存在，关闭旧窗口并创建新窗口
            await existingWindow.close()
            // 继续执行创建新窗口的代码
          }
        } catch (navError) {
          // navigate 失败，关闭旧窗口并创建新窗口
          console.log('无法导航窗口，将关闭并重新创建', navError)
          try {
            await existingWindow.close()
          } catch (closeError) {
            console.warn('关闭旧窗口失败', closeError)
          }
          // 继续执行创建新窗口的代码
        }
        
        // 如果 navigate 成功，更新标题和焦点
        if (typeof (existingWindow as any).navigate === 'function') {
          await existingWindow.setTitle(`${options.isVoiceOnly ? '语音' : '视频'}通话 - ${options.targetName}`)
          await existingWindow.setFocus()
          videoCallWindow = existingWindow
          console.log('视频通话窗口已更新')
          return
        }
        // 如果 navigate 不存在或失败，继续创建新窗口
      }
    } catch (e) {
      // 窗口不存在，继续创建新窗口
      console.log('窗口不存在，创建新窗口', e)
    }
    
    // 固定窗口大小（类似微信视频通话窗口）
    const width = 500
    const height = 400
    
    // 获取主窗口位置，用于计算视频窗口的居中位置
    const mainWindow = getCurrentWindow()
    const mainPosition = await mainWindow.innerPosition()
    const mainSize = await mainWindow.innerSize()
    
    // 计算窗口位置（在主窗口中心）
    const x = mainPosition.x + Math.floor((mainSize.width - width) / 2)
    const y = mainPosition.y + Math.floor((mainSize.height - height) / 2)
    
    // 获取当前环境的 URL
    const isDev = import.meta.env.DEV
    const baseUrl = isDev ? 'http://localhost:1420' : ''
    // 开发环境使用源文件路径，生产环境使用构建后的路径
    const videoCallPath = isDev ? '/src/pages/video-call/index.html' : '/video-call.html'
    const videoCallUrl = `${baseUrl}${videoCallPath}?targetUserId=${encodeURIComponent(options.targetUserId)}&targetName=${encodeURIComponent(options.targetName)}&currentUserId=${encodeURIComponent(options.currentUserId)}&isVoiceOnly=${options.isVoiceOnly || false}`
    
    // 创建新窗口
    videoCallWindow = new WebviewWindow(windowId, {
      url: videoCallUrl,
      title: `${options.isVoiceOnly ? '语音' : '视频'}通话 - ${options.targetName}`,
      width,
      height,
      x,
      y,
      resizable: false,
      minimizable: true,
      maximizable: false,
      closable: true,
      decorations: true,
      alwaysOnTop: false,
      skipTaskbar: false,
      focus: true,
      transparent: false,
      center: false,
    })
    
    // 监听窗口关闭事件（在 Tauri v2 中，once 返回 Promise<UnlistenFn>）
    await videoCallWindow.once('tauri://close-requested', () => {
      if (options.onClose) {
        options.onClose()
      }
      videoCallWindow = null
    }).catch((err: any) => {
      console.warn('监听窗口关闭事件失败', err)
    })
    
    // 监听窗口销毁事件
    await videoCallWindow.once('tauri://destroyed', () => {
      videoCallWindow = null
    }).catch((err: any) => {
      console.warn('监听窗口销毁事件失败', err)
    })
    
    console.log('视频通话窗口已创建', { width, height, x, y })
  } catch (error) {
    console.error('创建视频通话窗口失败:', error)
    throw error
  }
}

/**
 * 更新视频通话窗口模式（语音/视频切换）
 * 注意：此函数已被禁用，现在统一使用对话框模式
 */
export async function updateVideoCallWindowMode(isVoiceOnly: boolean, targetName: string): Promise<void> {
  // 已禁用独立窗口功能，统一使用对话框模式
  return
  
  if (!isTauri() || !videoCallWindow) {
    return
  }

  try {
    // 在 Tauri v2 中，WebviewWindow 从 @tauri-apps/api/webviewWindow 导入
    const { WebviewWindow } = await import('@tauri-apps/api/webviewWindow')
    
    if (!WebviewWindow) {
      console.error('WebviewWindow 不可用')
      return
    }
    
    const window = await WebviewWindow.getByLabel(windowId)
    
    if (window) {
      // 发送消息到窗口，通知切换模式
      await window.emit('switch-call-mode', { isVoiceOnly })
      // 更新窗口标题
      await window.setTitle(`${isVoiceOnly ? '语音' : '视频'}通话 - ${targetName}`)
    }
  } catch (error) {
    console.error('更新视频通话窗口模式失败:', error)
  }
}

/**
 * 关闭视频通话窗口
 */
export async function closeVideoCallWindow(): Promise<void> {
  if (!isTauri() || !videoCallWindow) {
    return
  }

  try {
    await videoCallWindow.close()
    videoCallWindow = null
    windowId = null
  } catch (error) {
    console.error('关闭视频通话窗口失败:', error)
  }
}

/**
 * 检查视频通话窗口是否打开
 */
export function isVideoCallWindowOpen(): boolean {
  return videoCallWindow !== null && windowId !== null
}

/**
 * 获取当前视频通话窗口 ID
 */
export function getVideoCallWindowId(): string | null {
  return windowId
}

